CloudFormationでVPCフローログを設定する (CloudWatch版)
VPCフローログをCloudFormationで設定する機会がありましたので、紹介させていただきます。S3とCloudWatch Logsへ保存できますが、今回はCloudWatch Logsへ保存したいと思います。
IAM Role
- CloudWatch Logsへログを保存するための必要最小限の権限で作成しています。
#-------------------------------------------------------------------- VpcFlowLogsIamRole: #-------------------------------------------------------------------- Type: "AWS::IAM::Role" Properties: RoleName: !Sub ${SystemName}-${Env}-flowlogs-role AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - "vpc-flow-logs.amazonaws.com" Action: - "sts:AssumeRole" Policies: - PolicyName: !Sub ${SystemName}-${Env}-flowlogs-policy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" - "logs:DescribeLogGroups" - "logs:DescribeLogStreams" Resource: "*"
LogGroup
- フローログを保存するロググループを作成します。
- 一定期間後に削除するように
RetentionInDays
を指定しています。
#-------------------------------------------------------------------- VpcFlowLogsLogGroup: #-------------------------------------------------------------------- Type: "AWS::Logs::LogGroup" Properties: LogGroupName: !Sub ${SystemName}-${Env}-vpc-flowlogs RetentionInDays: !Ref RetentionInDays
FlowLog
- VPCフローログを作成します。
- VPCは別スタックで作成している想定です。環境に合わせて変更してください。
#-------------------------------------------------------------------- VpcFlowLogs: #-------------------------------------------------------------------- Type: "AWS::EC2::FlowLog" Properties: ResourceType: "VPC" ResourceId: Fn::ImportValue: !Sub ${SystemName}-${Env}-vpc TrafficType: !Ref TrafficType DeliverLogsPermissionArn: !GetAtt VpcFlowLogsIamRole.Arn LogGroupName: !Ref VpcFlowLogsLogGroup
テンプレート全体
パラメータ、リソース名などはお好みで変更してください。
--- AWSTemplateFormatVersion: '2010-09-09' Description: VPC Flow Logs #-------------------------------------------------------------------- Parameters: #-------------------------------------------------------------------- SystemName: Description: This value is used as the resource prefix. Type: String Default: example MinLength: 1 Env: Description: Environment Name Type: String Default: dev AllowedValues: [ dev ] TrafficType: Description: The type of traffic to log. Type: String Default: ALL AllowedValues: [ ACCEPT, REJECT, ALL ] RetentionInDays: Description: The number of days to retain the log events in the specified log group. Type: Number Default: 30 AllowedValues: [ 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653 ] #-------------------------------------------------------------------- Resources: #-------------------------------------------------------------------- #-------------------------------------------------------------------- VpcFlowLogs: #-------------------------------------------------------------------- Type: "AWS::EC2::FlowLog" Properties: ResourceType: "VPC" ResourceId: Fn::ImportValue: !Sub ${SystemName}-${Env}-vpc TrafficType: !Ref TrafficType DeliverLogsPermissionArn: !GetAtt VpcFlowLogsIamRole.Arn LogGroupName: !Ref VpcFlowLogsLogGroup #-------------------------------------------------------------------- VpcFlowLogsLogGroup: #-------------------------------------------------------------------- Type: "AWS::Logs::LogGroup" Properties: LogGroupName: !Sub ${SystemName}-${Env}-vpc-flowlogs RetentionInDays: !Ref RetentionInDays #-------------------------------------------------------------------- VpcFlowLogsIamRole: #-------------------------------------------------------------------- Type: "AWS::IAM::Role" Properties: RoleName: !Sub ${SystemName}-${Env}-flowlogs-role AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - "vpc-flow-logs.amazonaws.com" Action: - "sts:AssumeRole" Policies: - PolicyName: !Sub ${SystemName}-${Env}-flowlogs-policy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" - "logs:DescribeLogGroups" - "logs:DescribeLogStreams" Resource: "*"
終わりに
普段はあまり参照することのないフローログですが、通信できないなどの障害があった場合には、調査で見ることも多いかと思います。このテンプレートがお役に立てば幸いです。